package pe.edu.upla.lamerced.action;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.DynaActionForm;
import org.apache.struts.actions.DispatchAction;
import org.springframework.beans.factory.annotation.Autowired;

import pe.edu.upla.lamerced.bean.Categoria;
import pe.edu.upla.lamerced.bean.Habitacion;
import pe.edu.upla.lamerced.bean.Hospedaje;
import pe.edu.upla.lamerced.bean.Tipohabitacion;
import pe.edu.upla.lamerced.service.CategoriaService;
import pe.edu.upla.lamerced.service.HabitacionService;
import pe.edu.upla.lamerced.service.HospedajeService;
import pe.edu.upla.lamerced.utiles.Utiles;

public class HabitacionesAction extends DispatchAction {
	
	private static final Logger logger = Logger.getLogger(HabitacionesAction.class);
	
	@Autowired
	HabitacionService habitacionService;
	@Autowired
	CategoriaService categoriaService;
	@Autowired
	HospedajeService hospedajeService;
	
	public ActionForward lista(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)	throws Exception {
		try {
           logger.debug("lista de habitaciones");
           request.setAttribute("hab", new Habitacion());
           request.setAttribute("lstHabitaciones", habitacionService.listaHabitaciones());
           request.setAttribute("lstipohabitacion", habitacionService.listaTipoHabitacion());
			request.setAttribute("lstCategorias", categoriaService.listarCategorias());
		} catch (Exception e) {
            e.printStackTrace();
            request.setAttribute("msgError", e.getMessage());
            return mapping.findForward("home");
		}
		return mapping.findForward("lista");
	}
	
	public ActionForward buscar(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)	throws Exception {
		try {
			 DynaActionForm myform = (DynaActionForm)form;
			 Habitacion habitacion = new Habitacion();
			 if(!myform.getString("piso").equals(""))
				 habitacion.setPiso(Integer.parseInt(myform.getString("piso")));
			 Categoria cat = new Categoria();
			 if(!myform.getString("idcategoria").equals(""))
				 cat.setIdcategoria(Integer.parseInt(myform.getString("idcategoria")));
			 habitacion.setCategoria(cat);
			 Tipohabitacion tip = new Tipohabitacion();
			 if(!myform.getString("idtipoHabitacion").equals(""))
				 tip.setIdtipoHabitacion(Integer.parseInt(myform.getString("idtipoHabitacion"))); 
			 habitacion.setTipohabitacion(tip);
			 request.setAttribute("hab", new Habitacion());
			 logger.debug("lista de habitaciones");
			 request.setAttribute("lstHabitaciones", habitacionService.listaHabitaciones(habitacion));
			 request.setAttribute("lstipohabitacion", habitacionService.listaTipoHabitacion());
			 request.setAttribute("lstCategorias", categoriaService.listarCategorias());
		} catch (Exception e) {
            e.printStackTrace();
            request.setAttribute("msgError", e.getMessage());
            return mapping.findForward("home");
		}
		return mapping.findForward("lista");
	}
	
	public ActionForward listaAjax(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)	throws Exception {
		try {
			Tipohabitacion tip = new Tipohabitacion();
			 if(!request.getParameter("cod").equals("")){
				 tip.setIdtipoHabitacion(Integer.parseInt(request.getParameter("cod")));
			 }
			 Habitacion habitacion = new Habitacion();
			 habitacion.setTipohabitacion(tip);
			 habitacion.setEstado(0);
			 List<Habitacion> lis = habitacionService.listaHabitaciones(habitacion);
			request.setAttribute("lsHabitacion", lis);			
           logger.debug(lis.size() + " HABITACIONES DISPONIBLES");
		} catch (Exception e) {
            e.printStackTrace();
            request.setAttribute("msgError", e.getMessage());
		}
		return mapping.findForward("ajax");
	}
	
	public ActionForward predisponibles(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)	throws Exception {
		try {
			logger.debug("PRE HABITACIONES DISPONIBLES");
			request.getSession().setAttribute("lstipohabitacion", habitacionService.listaTipoHabitacion());
			request.getSession().setAttribute("lstCategorias", categoriaService.listarCategorias());
		} catch (Exception e) {
            e.printStackTrace();
            request.setAttribute("msgError", e.getMessage());
            return mapping.findForward("home");
		}
		return mapping.findForward("disponibles");
	}
	
	public ActionForward disponibles(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)	throws Exception {
		try {
           logger.debug("BUSQUEDA DE HABITACIONES DISPONIBLES");
           
          // request.setAttribute("lstipohabitacion", habitacionService.listaTipoHabitacion());
           //request.setAttribute("lstCategorias", categoriaService.listarCategorias());
           
           DynaActionForm myform = (DynaActionForm)form;
           Hospedaje h = new Hospedaje();
           Habitacion hab = new Habitacion();
           Categoria cat = new Categoria();
           cat.setIdcategoria(Integer.parseInt(myform.getString("idcategoria")));
           Tipohabitacion tip = new Tipohabitacion();
           tip.setIdtipoHabitacion(Integer.parseInt(myform.getString("idtipoHabitacion")));
           hab.setCategoria(cat);            
           hab.setTipohabitacion(tip);           
           hab.setEstado(1);
           h.setFecReserva(Utiles.stringToDate(myform.getString("fecReserva"), Utiles.FORMATO_FECHA_CORTA));
           h.setHabitacion(hab);
           //TODO buscar habitaciones que no tengagn reserva en esa fecha
           //join de la tabla habitacion con hospedajes segun estado 
          
           request.setAttribute("lhabDispon", hospedajeService.buscarHabitacionesdisponibles(h));
          
          
		} catch (Exception e) {
            e.printStackTrace();
            request.setAttribute("msgError", e.getMessage());
            return mapping.findForward("disponibles");
		}
		return mapping.findForward("disponibles");
	}
	public ActionForward preNuevaHab(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)	throws Exception {
		try {
			//request.setAttribute("habit", new Habitacion());
			//no trabajo con el bean sino con el dynaactionform
			if(request.getSession().getAttribute("lstipohabitacion")==null)
			request.getSession().setAttribute("lstipohabitacion", habitacionService.listaTipoHabitacion());
			if(request.getSession().getAttribute("lstCategorias")==null)
			request.getSession().setAttribute("lstCategorias", categoriaService.listarCategorias());
            logger.debug(" PRE NUEVA HABITACION, no dejo nada en session");
        } catch (Exception e) {
            e.printStackTrace();
            request.setAttribute("msgError", e.getMessage());
            return mapping.findForward("reserva");
		}
		return mapping.findForward("nueva");
	}
	public ActionForward nuevaHab(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)	throws Exception {
		try {
            logger.debug(" INFORMACION DE HABITACION RALIZADA");
            DynaActionForm myform = (DynaActionForm)form;
            logger.debug(myform.toString());            
            Habitacion hab = new Habitacion();
            hab.setNumero(Integer.parseInt(myform.getString("numero")));
            hab.setPiso(Integer.parseInt(myform.getString("piso")));
            Categoria cat = new Categoria();
			cat.setIdcategoria(Integer.parseInt(myform.getString("idcategoria")));
			hab.setCategoria(cat);
			Tipohabitacion tip = new Tipohabitacion();
			tip.setIdtipoHabitacion(Integer.parseInt(myform.getString("idtipoHabitacion"))); 
			hab.setTipohabitacion(tip);
            hab.setPrecioBase(new Long(myform.getString("precioBase")));            
            if(Utiles.nullToBlank(myform.getString("idhabitacion")).equals("")){
            	hab.setEstado(0);
            }else{
            	hab.setIdhabitacion(Integer.parseInt(myform.getString("idhabitacion")));
            	hab.setEstado(Integer.parseInt(myform.getString("estado")));
            }
            habitacionService.registrarHabitacion(hab);
            logger.debug(hab.toString());            
            hab = habitacionService.obtenerHabitacion(hab.getIdhabitacion());
            request.setAttribute("dhab", hab);
            request.setAttribute("mensaje", "Habitacion registrada en la base de datos");
        } catch (Exception e) {
        	//request.setAttribute("lstipohabitacion", habitacionService.listaTipoHabitacion());
        	//request.setAttribute("lstCategorias", categoriaService.listarCategorias());
            e.printStackTrace();
            request.setAttribute("msgError", e.getMessage());
            return mapping.findForward("nueva");
		}
		return mapping.findForward("confirmar");
	}
	
	public ActionForward cancelNuevaHab(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)	throws Exception {
		try {
            logger.debug("canclando nueva habitacion");
            //request.setAttribute("mensaje", "El procedimiento ha sido cancelado");
        } catch (Exception e) {
            e.printStackTrace();
            request.setAttribute("msgError", e.getMessage());
		}
		//return mapping.findForward("lista");
        return lista(mapping, form, request, response);
	}
	
	public ActionForward preEdit(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)	throws Exception {
		try {
			logger.debug("pre edit habitacion");
			Integer cod = Integer.parseInt(request.getParameter("cod"));
			DynaActionForm myform = (DynaActionForm)form;
			Habitacion hab = habitacionService.obtenerHabitacion(cod);
			myform.set("idhabitacion", hab.getIdhabitacion().toString());
			myform.set("numero", hab.getNumero().toString());
			myform.set("piso", hab.getPiso().toString());
			myform.set("idtipoHabitacion", hab.getTipohabitacion().getIdtipoHabitacion().toString());
			myform.set("idcategoria", hab.getCategoria().getIdcategoria().toString());
			myform.set("precioBase", hab.getPrecioBase().toString());
			myform.set("estado", hab.getEstado().toString());
			request.setAttribute("lstipohabitacion", habitacionService.listaTipoHabitacion());
	        request.setAttribute("lstCategorias", categoriaService.listarCategorias());
	        //request.setAttribute("habit", habitacionService.obtenerHabitacion(cod));
        } catch (Exception e) {
            e.printStackTrace();
            request.setAttribute("msgError", e.getMessage());
		}
        return mapping.findForward("nueva");
	}
	
	public ActionForward view(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)	throws Exception {
		try {
			Integer cod = Integer.parseInt(request.getParameter("cod"));
	        request.setAttribute("dhab", habitacionService.obtenerHabitacion(cod));
            logger.debug("ver detalle de habitacion");
           // request.setAttribute("mensaje", "El procedimiento ha sido cancelado");
        } catch (Exception e) {
            e.printStackTrace();
            request.setAttribute("msgError", e.getMessage());
		}
        return mapping.findForward("confirmar");
	}
	
}